#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QStandardItemModel>
#include <QMenu>
#include <QMenuBar>
#include "adapterselector.h"
#include "common.h"
#include "sessionmanager.h"

// 前向声明
class PacketCapturer;

QT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
    
private slots:
    // 菜单栏槽函数
    void on_actionStartCapture_triggered();
    void on_actionStopCapture_triggered();
    void on_actionExit_triggered();
    void on_actionSettings_triggered();
    void on_actionAbout_triggered();
    
    // 按钮槽函数
    void on_startCaptureButton_clicked();
    void on_stopCaptureButton_clicked();
    void on_applyFilterButton_clicked();
    void on_clearFilterButton_clicked();
    
    // 表格槽函数
    void on_packetTable_clicked(const QModelIndex &index);
    void on_packetTable_doubleClicked(const QModelIndex &index);
    
    // 网卡选择对话框槽函数
    void onAdapterSelected();
    
    // PacketCapturer相关槽函数
    void onPacketCaptured(const PacketInfo &packetInfo);
    void onCaptureStarted();
    void onCaptureStopped();
    void onCaptureError(const QString &errorMsg);
    
    // 辅助方法
    void addLog(const QString &message);

private:
    Ui::Widget *ui;
    
    // 网卡选择对话框
    AdapterSelector *m_adapterSelector;
    
    // 当前选择的网卡
    QString m_currentAdapter;
    
    // 数据包表格模型
    QStandardItemModel *m_packetModel;
    
    // 存储所有捕获的数据包
    QList<PacketInfo> m_packets;
    
    // 协议统计信息
    QMap<QString, int> m_protocolStats;
    
    // 总统计信息
    int m_totalPackets;
    long long m_totalBytes;
    
    // 数据包捕获器
    PacketCapturer *m_packetCapturer;
    
    // 过滤相关
    QString m_filterExpression;
    QList<PacketInfo> m_filteredPackets;
    bool m_isFiltered;
    
    // 会话管理相关
    SessionManager *m_sessionManager;
    QStandardItemModel *m_sessionModel;
    QString m_selectedSessionId;
    
    // 初始化方法
    void initUI();
    void initMenuBar();
    void initPacketTable();
    void updateStats();
    
    // 模拟数据方法（用于测试）
    void addSamplePacket();
    
    // 显示网卡选择对话框
    void showAdapterSelector();
    
    // 过滤相关方法
    bool applyFilter(const PacketInfo &packet);
    void updateFilteredTable();
    void displayPacketDetails(const PacketInfo &packet);
    
    // 会话管理相关方法
    void initSessionTable();
    void updateSessionTable();
    void onNewSessionDetected(const ProtocolSession &session);
    void onSessionUpdated(const ProtocolSession &session);
    void onSessionCompleted(const ProtocolSession &session);
    void onSessionTableClicked(const QModelIndex &index);
    void displaySessionDetails(const ProtocolSession &session);
    void filterSessions(const QString &filter);
};
#endif // WIDGET_H
